enum {
TPM_MINOR = 224, /* officially assigned */
- TPM_BUFSIZE = 2048,
+ TPM_MIN_BUFSIZE = 2048,
+ TPM_MAX_BUFSIZE = 65536,
TPM_NUM_DEVICES = 256,
TPM_NUM_MASK_ENTRIES = TPM_NUM_DEVICES / (8 * sizeof(int))
};
down(&chip->buffer_mutex);
atomic_set(&chip->data_pending, 0);
- memset(chip->data_buffer, 0, TPM_BUFSIZE);
+ memset(chip->data_buffer, 0, chip->vendor->buffersize);
up(&chip->buffer_mutex);
}
spin_unlock(&driver_lock);
- chip->data_buffer = kmalloc(TPM_BUFSIZE * sizeof(u8), GFP_KERNEL);
+ chip->data_buffer = kmalloc(chip->vendor->buffersize * sizeof(u8),
+ GFP_KERNEL);
if (chip->data_buffer == NULL) {
chip->num_opens--;
put_device(chip->dev);
down(&chip->buffer_mutex);
- if (in_size > TPM_BUFSIZE)
- in_size = TPM_BUFSIZE;
+ if (in_size > chip->vendor->buffersize)
+ in_size = chip->vendor->buffersize;
if (copy_from_user
(chip->data_buffer, (void __user *) buf, in_size)) {
}
/* atomic tpm command send and result receive */
- out_size = tpm_transmit(chip, chip->data_buffer, TPM_BUFSIZE);
+ out_size = tpm_transmit(chip,
+ chip->data_buffer,
+ chip->vendor->buffersize);
atomic_set(&chip->data_pending, out_size);
up(&chip->buffer_mutex);
chip->vendor = entry;
+ if (entry->buffersize < TPM_MIN_BUFSIZE) {
+ entry->buffersize = TPM_MIN_BUFSIZE;
+ } else if (entry->buffersize > TPM_MAX_BUFSIZE) {
+ entry->buffersize = TPM_MAX_BUFSIZE;
+ }
+
chip->dev_num = -1;
for (i = 0; i < TPM_NUM_MASK_ENTRIES; i++)
.base = 0,
.attr = TPM_DEVICE_ATTRS,
.miscdev.fops = &tpm_xen_ops,
+ .buffersize = 64 * 1024,
};
static struct device tpm_device = {
return rc;
}
+ tpm_xen.buffersize = tpmfe.max_tx_size;
+
if ((rc = tpm_register_hardware_nopci(&tpm_device, &tpm_xen)) < 0) {
device_unregister(&tpm_device);
tpm_fe_unregister_receiver();